package com.dubbo.common;
/**
 * 成功返回的状态
 * @author chenwei
 * @date 2018年3月12日 下午3:58:19
 */

import com.dubbo.common.cookie.CookieUtils;
import com.dubbo.common.exception.UserExpiredException;
import com.dubbo.common.redis.RedisDao;
import com.dubbo.common.result.ResultInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
 * 控制层成功返回数据封装工具
 * @author chenwei
 * @date 2018年3月12日 下午4:01:15
 */
public class ResponseUtil {
	private static Logger logger = Logger.getLogger(ResponseUtil.class);
	
	/**
	 * ajax校验成功返回状态
	 * 
	 * @author chenwei
	 * @date 2018年3月12日 下午4:03:54
	 * @param message
	 * @return
	 */
	public static Map<String, Object> ajaxCheckSuccess(String message){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.SUCCESS);
		map.put(ResultInfo.MESSAGE, message);
		return map;
	}
	/**
	 * ajax校验成功返回状态加简单数据
	 * 
	 * @author chenwei
	 * @param <T>
	 * @date 2018年3月19日 下午4:49:02
	 * @param message
	 * @param targetName
	 * @param targetValue
	 * @return
	 */
	public static Map<String, Object> ajaxCheckSuccess(String message,String targetName,Object targetValue){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.SUCCESS);
		map.put(targetName, targetValue);
		map.put(ResultInfo.MESSAGE, message);
		return map;
	}
	/**
	 * ajax校验成功返回状态加对象数据
	 * 
	 * @author chenwei
	 * @date 2018年3月23日 下午3:59:48
	 * @param message
	 * @param dataMap
	 * @return
	 */
	public static Map<String, Object> ajaxCheckSuccess(String message,Object result){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.SUCCESS);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.RESULT, result);
		return map;
	}
	/**
	 * ajax表单校验错误返回数据,带错误目标
	 * 
	 * @author chenwei
	 * @date 2018年3月13日 上午9:37:23
	 * @param message 错误信息说明
	 * @param target 错误目标标签的id名称
	 * @return
	 */
	public static Map<String, Object> ajaxCheckError(String message,String target){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.TARGET, target);
		return map;
	}
	/**
	 * ajax表单校验错误返回数据,带错误目标
	 * 
	 * @author chenwei
	 * @date 2018年3月13日 上午9:37:23
	 * @param message 错误信息说明
	 * @param target 错误目标标签的id名称
	 * @return
	 */
	public static Map<String, Object> ajaxCheckError(String message,Object result){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.RESULT, result);
		return map;
	}
	/**
	 * ajax表单校验错误返回数据,带错误目标,结果集
	 * 
	 * @author chenwei
	 * @date 2018年3月13日 上午9:37:23
	 * @param message 错误信息说明
	 * @param target 错误目标标签的id名称
	 * @return
	 */
	public static Map<String, Object> ajaxCheckError(String message,String target,Object result){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.TARGET, target);
		map.put(ResultInfo.RESULT, result);
		return map;
	}
	/**
	 * ajax表单校验错误返回数据
	 * 
	 * @author chenwei
	 * @date 2018年3月13日 上午9:38:41
	 * @param message 错误信息说明
	 * @return
	 */
	public static Map<String, Object> ajaxCheckError(String message){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		return map;
	}
	/**
	 * ajax表单校验错误返回数据
	 * <p>备注: 用户在线失效时使用</p>
	 * @author chenwei
	 * @date 2018年3月13日 上午9:38:41
	 * @param message 错误信息说明
	 * @return
	 */
	public static Map<String, Object> ajaxCheckErrorBy401(String message){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.CODE401);
		map.put(ResultInfo.MESSAGE, message);
		return map;
	}
	/**
	 * ajax表单校验错误返回数据
	 * <p>备注: 没有权限时使用</p>
	 * @author chenwei
	 * @date 2018年3月13日 上午9:38:41
	 * @param message 错误信息说明
	 * @return
	 */
	public static Map<String, Object> ajaxCheckErrorBy403(String message){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.CODE403);
		map.put(ResultInfo.MESSAGE, message);
		return map;
	}
	/**
	 * 错误信息响应,带页面跳转标记
	 * 
	 * @author chenwei
	 * @date 2019年1月7日 上午11:37:06
	 * @param message 错误提示
	 * @param target 开发者错误提示
	 * @param jumpPage 页面跳转,只是一个标记,但不允许自定义,必须使用ResultInfo类调用跳转标记
	 * @return
	 */
	public static Map<String, Object> ajaxCheckErrorByJump(String message,String target,String jumpPage) {
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.TARGET, target);
		map.put(ResultInfo.JUMP, jumpPage);
		return map;
	}
	/**
	 * 错误信息响应,带页面跳转标记
	 * 
	 * @author chenwei
	 * @date 2019年1月7日 上午11:37:06
	 * @param message 错误提示
	 * @param target 开发者错误提示
	 * @param jumpPage 页面跳转,只是一个标记,但不允许自定义,必须使用ResultInfo类调用跳转标记
	 * @return
	 */
	public static Map<String, Object> ajaxCheckErrorByJump(String message,Map<String, Object> result,String jumpPage) {
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.RESULT, result);
		map.put(ResultInfo.JUMP, jumpPage);
		return map;
	}
	/**
	 * 错误信息响应,带页面跳转标记
	 * 
	 * @author chenwei
	 * @date 2019年1月7日 上午11:37:06
	 * @param message 错误提示
	 * @param target 开发者错误提示
	 * @param jumpPage 页面跳转,只是一个标记,但不允许自定义,必须使用ResultInfo类调用跳转标记
	 * @return
	 */
	public static Map<String, Object> ajaxCheckErrorByJump(Map<String, Object> result,String jumpPage) {
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, "");
		map.put(ResultInfo.RESULT, result);
		map.put(ResultInfo.JUMP, jumpPage);
		return map;
	}
	/**
	 * 错误信息响应,带页面跳转标记
	 * 
	 * @author chenwei
	 * @date 2019年1月7日 上午11:40:55
	 * @param message 错误提示
	 * @param jumpPage 页面跳转,只是一个标记,但不允许自定义,必须使用ResultInfo类调用跳转标记
	 * @return
	 */
	public static Map<String, Object> ajaxCheckErrorByJump(String message,String jumpPage) {
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.ERROR);
		map.put(ResultInfo.MESSAGE, message);
		map.put(ResultInfo.JUMP, jumpPage);
		return map;
	}
	/**
	 * 登录失效返回json
	 * @author lianglie
	 * @date 2018年12月7日 下午3:53:43
	 * @param message 登录失效,的提示信息
	 * @return
	 */
	public static Map<String, Object> loginInvalid(String message){
		Map<String, Object> map = new HashMap<String, Object>(4);
		map.put(ResultInfo.STATUS, ResultInfo.LOGIN_INVALID);
		map.put(ResultInfo.MESSAGE, message);
		return map;
	}
	
	/**
	 * 更新reids和cookie的在线用户数据和生命周期
	 * 
	 * @author chenwei
	 * @date 2018年3月27日 下午4:49:50
	 * @param request
	 * @param response 
	 * @param redisDao 操作redis的对象
	 * @param userTicket 在cookie中的key
	 * @param userJson 用户数据json格式
	 * @param timeout 生命周期(毫秒值)
	 * @param encoded 是否编码
	 * @throws UserExpiredException
	 */
	public static void updateUserOline(
			HttpServletRequest request,
			HttpServletResponse response,
			RedisDao redisDao,
			String userTicket,
			String userJson,
			long timeout,
			boolean encoded) throws UserExpiredException {
		String cookieValue = CookieUtils.getCookieValue(request, userTicket, encoded);
		if(!StringUtils.isNotBlank(cookieValue)) {
			throw new UserExpiredException("登录失效,请重新登录!");
		}
		redisDao.set(cookieValue, userJson, timeout/1000);
		CookieUtils.setCookie(request, response, userTicket, cookieValue, (int)(timeout/1000), encoded);
	}
	
	/**
	 * response响应json数据格式
	 * 
	 * @author chenwei
	 * @date 2018年12月11日 下午5:42:44
	 * @param response
	 * @param result
	 */
	public static void returnJson(HttpServletResponse response, Map<String, Object> result) {
		//创建json转换的类
		ObjectMapper mapper = new ObjectMapper();
		PrintWriter writer = null;
		try {
			String jsonString = mapper.writeValueAsString(result);
			// 避免乱码
			response.setCharacterEncoding("UTF-8");
			// 设置ContentType
			response.setContentType("application/json; charset=utf-8");
			writer = response.getWriter();
			writer.write(jsonString);
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e);
		}finally {
			writer.close();
		}
	}
}
